home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
adjram41.zip
/
AMDISK.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-05-15
|
33KB
|
1,165 lines
; ==== Adjustable Memory Disk Device Driver ====
;
; (c) Copyright 1986,1987,1988 by Gary R. Cramblitt
;
; v2.2 1 Jul 86 Initial version
; v2.3 24 Aug 86 Bug. FAT media byte not updated properly
; v2.4 29 Aug 86 Sync version # with ADJRAM.C No other changes.
; v2.5 30 Aug 86 Add /E (LOTUS/INTEL,Microsoft Expanded Memory) support;
; Increase root directory to 128 entries;
; Permit maximum size of 2043K.
; Get rid of second FAT.
; v3.0 5 Sep 86 Sync version # with ADJRAM.C. No other changes.
; v3.1 2 Oct 86 Sync version # with ADJRAM.C. No other changes.
; v3.2 18 Oct 86 Add SIZE= option
; v4.0 3 Jan 87 Chg SIZE= to MINSIZE=
; Add support for reserved conventional memory.
; Add CLUSTER= option.
; Allow for expanded memory blocks larger than 64K.
; Use legal FAT ID. CHKDSK now happy with memory disk, and
; occasional DOS "FAT error" prevented.
; Add volume label to memory disk.
; v4.1 15 May 88 Restrict reserved memory to A segment or above.
; Initialize reserved memory.
;
; ==== Constant Definition ===================
;
; ---- Customizable Definitions -----
; If these are changed, the corresponding symbols in adjram.c
; must be altered.
def_size_K equ 64 ; default 64K ram disk
max_isize_K equ 512 ; maximum 512K initial ram disk size
cnv_sec_per_blk equ 64 ; 32K increments in conventional mem
max_clusters equ 4086 ; max clusters per disk
; (12-bit FAT entries)
bytes_per_sec equ 512 ; bytes per sector
def_sec_per_cl equ 1 ; default sectors per cluster
par_per_sec_lg2 equ 5 ; 16-byte paragraphs per sector
; log 2. Must match bytes_per_sec
fats_per_disk equ 1 ; number of FATS
; ---- Derived quantities ----
max_mem_blks equ (max_clusters/cnv_sec_per_blk)
; Maximum number of memory blocks
; assuming cluster size of 1
sec_per_K equ 1024/bytes_per_sec ; sectors per 1024 bytes
sec_per_K_lg2 equ 1 ; must match above parameter
par_per_sec equ bytes_per_sec/16 ; 16-byte paragraphs per sector
def_size_sec equ def_size_K*sec_per_K ; default size in sectors
bytes_per_fat equ max_clusters*3/2
sec_per_fat equ (bytes_per_fat+bytes_per_sec-1)/bytes_per_sec
sec_per_em_pag equ 16*sec_per_K ; sectors per expanded mem page
sec_per_em_pag_lg2 equ 5 ; sectors per em page log 2, must
; match above parameter
sec_per_em_pag_msk equ sec_per_em_pag-1
; ---- Static Request Header Structure Definitions ----
srh_length equ 0 ; (byte) length field
srh_unit equ 1 + srh_length ; (byte) unit field
srh_command equ 1 + srh_unit ; (byte) command code
srh_status equ 1 + srh_command ; (word) status field
srh_reserved equ 2 + srh_status ; (8 bytes)
srh_size equ 8 + srh_reserved ; request header size
; ---- Request Header Status values ----
s_done equ 0100h ; done, no errors
s_busy equ 0200h ; busy, no errors
e_err equ 8000h
e_protect equ e_err+0h ; error: write protect
e_unknown_unit equ e_err+1h ; error: unknown unit
e_not_ready equ e_err+2h ; error: not ready
e_command equ e_err+3h ; error: unknown command
e_crc equ e_err+4h ; error: bad CRC
e_bad_length equ e_err+5h ; error: bad structure length
e_seek equ e_err+6h ; error: bad seek
e_media equ e_err+7h ; error: unknown media
e_not_found equ e_err+8h ; error: sector not found
e_paper equ e_err+9h ; error: out of paper
e_write equ e_err+ah ; error: write fault
e_read equ e_err+bh ; error: read fault
e_general equ e_err+ch ; error: general error not listed above
; ---- Non-destructive read parameter block ----
rh_read_data equ srh_size ; (byte) non-destructive data
; ---- Input/output parameter block ----
rh_media equ 0 + srh_size ; (byte) media descriptor
rh_buf_offset equ 1 + rh_media ; (word) transfer buffer offset
rh_buf_segment equ 2 + rh_buf_offset ; (word) transfer buffer segment
rh_buf_size equ 2 + rh_buf_segment ; (word) transfer buffer size
rh_start equ 2 + rh_buf_size ; (word) transfer starting sector
m_fixed equ 0f8h ; media: fixed disk
m_ss9 equ 0fch ; media: single sided, 8 sectors/track
m_ds9 equ 0fdh
m_ss8 equ 0feh
m_ds8 equ 0ffh
; ---- Build BPB parameter block ----
; preceeded by media descriptor
rh_bpb equ 1 + rh_media ; (dword) bpb buffer address
rh_tbl_offset equ 4 + rh_bpb ; (dword) bpb table offset/segment
rh_tbl_segment equ 2 + rh_tbl_offset
; ---- Media Check parameter block ----
rh_check equ 1 + rh_media ; (byte) media check result
mc_changed equ -1 ; media has changed
mc_maybe equ 0 ; media may have been changed
mc_same equ 1 ; media has not changed
; ---- Initialize parameter block ----
rh_units equ 0 + srh_size ; (byte) number of units supported
rh_end_offset equ 1 + rh_units ; (word) end address of driver
rh_end_segment equ 2 + rh_end_offset
rh_bpb_offset equ 2 + rh_end_segment ; (word) BPB array address
rh_bpb_segment equ 2 + rh_bpb_offset
rh_cmd_offset equ rh_bpb_offset ; (word) "device=" cmd line
rh_cmd_segment equ rh_bpb_segment
rh_cmd equ rh_bpb_offset
; ---- DOS interrupts ----
dosi_dosf equ 21h ; DOS function dispatcher
; ---- User Interrupts ----
usri_emm equ 67h ; Expanded Memory Manager
; ---- DOS interrupt 21 functions ----
dosf_outstr equ 9 ; display string
dosf_seldisk equ 0eh ; select disk
dosf_getdisk equ 19h ; get current disk
; ---- LOTUS/INTEL/Microsoft Expanded Memory Manager functions ----
emm_status equ 40h ; get manager status
emm_get_PFseg equ 41h ; get page frame segment
emm_get_pages equ 42h ; get number of pages
emm_get_handle equ 43h ; get handle and allocate memory
emm_map_memory equ 44h ; map memory
emm_fre_handle equ 45h ; free handle and memory
emm_get_ver equ 46h ; get EMM version
emm_sav_map equ 47h ; save mapping context
emm_res_map equ 48h ; restore mapping context
emm_num_handles equ 4bh ; get number of EMM handles
emm_hdl_pages equ 4ch ; get pages owned by handle
emm_all_pages equ 4dh ; get pages for all handles
emm_pag_map equ 4eh ; get or set page map
; ---- Device Driver Header Attribute Definitions ----
a_input equ 0001h ; standard input device
a_output equ 0002h ; standard output device
a_nul equ 0004h ; NUL device
a_clock equ 0008h ; CLOCK$ device
a_ibm equ 0 ; IBM block device (bit 13)
a_not_ibm equ 2000h ; non-IBM block device (bit 13)
a_ioctl equ 4000h ; IOCTL functions supported
a_block equ 0 ; block device (bit 15)
a_character equ 8000h ; character device (bit 15)
; ---- FAT IDs ----
fid_fix equ 0f8h ; fixed disk
fid_ds15 equ 0f9h ; double-sided, 15 sector
fid_ss9 equ 0fch ; single-sided, 9 sector
fid_ds9 equ 0fdh ; double-sided, 9 sector
fid_ss8 equ 0feh ; single-sided, 8 sector
fid_ds8 equ 0ffh ; double-sided, 8 sector
fid_ss8sd equ 0feh ; single-sided, 8 inch, single dens
fid_ss8sd_alt equ 0fdh ; alternate sssd 8 inch
fid_ds8dd equ 0feh ; double-side, 8 inch, double-dens
; ---- Character Codes ----
cc_ht equ 9 ; TAB
cc_cr equ 13
cc_lf equ 10
cc_sp equ ' '
cc_bel equ 7
; ==== Device Driver Header Definition ====
cseg segment para public 'CODE'
driver proc far
assume cs:cseg,ds:cseg,es:cseg
dd -1 ; last driver in chain
dw a_block + a_not_ibm ; driver attribute
dw dev_strategy ; offset to strategy routine
dw dev_interrupt ; offset to interrupt routine
db 1 ; number of devices or device name
db 7 dup ( ? ) ; filler for block device
; ==== Device Driver Tables ====
;
; ---- BIOS Parameter Block Table and Entries ----
bpb_table dw bpb ; one entry for each unit
; ---- Request Header Address set by dev_strategy ----
rh_address dd 1 dup ( ? ) ; request header base address
rh_offset equ word ptr rh_address
rh_segment equ word ptr rh_address + 2
; ---- Request Header Command Dispatch Table ----
cmd_table dw initialize ; initialize driver
dw media_check ; media check
dw build_bpb ; build BPB
dw ioctl_read ; IOCTL read
dw read ; normal read
dw check_input ; non-destructive read/status
dw input_status ; input status
dw i